#ifndef _APPLICATION_H
#define _APPLICATION_H

#include <string>
#include <app/Atime.h>
#include <app/modules/Ainput.h>

enum OGLContext {
    OGLC_GLFW, OGLC_QT
};
struct OGLTools {
    OGLContext OpenGLContext; //kind of context (GLFW or Qt)
    void ( *CreateQtOGLContext ) (); //called in Qt app for creation openGL Qt context
    void ( *glSwapBuffers ) ();
    bool ( *glWindowShouldClose ) ();
};

struct Settings {
    bool fullscreen = false;
    uint32_t windowWidth;
    uint32_t windowHeight;
    uint8_t windowMonitor;
    bool windowResizeble;
    std::string windowName;
    unsigned int MSAA;
    bool textBlending = true;    
};

struct Application {
    Application ();
    
    std::string appName;
    std::string companyName;
    
    uint8_t appVersionMajor;
    uint8_t appVersionMinor;
    uint8_t appVersionCertificate;
    
    uint8_t ameVersionMajor;
    uint8_t ameVersionMinor;
    uint8_t ameversionCertificate;

    bool running = true;
    
    Settings settings;
    Atime time;
    Ainput input;
    
    OGLTools openGLTools; //used in OGLRender class to controling openGL contexts

    void (*update)(); //link to function, called then every update window surface
    void (*mousePositionCallback)();
    void (*keyboardCallback)();
};

#endif // APPLICATION_H
